#pragma once
#include "../common/tcp_base_common_type.h"



//////////////////////////////////////////////////////////////////////////
//

class recv_packet_t
{
public:
	recv_packet_t( packet_id_t packet_id, char const* buffer, packet_size_t size );

	template<typename data_type>
	recv_packet_t & operator >> (data_type & data);

	template<typename data_type>
	data_type&& parse();

	packet_id_t packet_id() const { return packet_id_; }

private:
	packet_id_t packet_id_;
	umtl::memory_buffer buffer_;
	umtl::memory_stream stream_;
};

//////////////////////////////////////////////////////////////////////////
//

template<typename data_type>
recv_packet_t & recv_packet_t::operator >> (data_type & data)
{
	//if( stream_.good() == false )
	//	throw packet_parse_exception( "invalid recv_packet buff" );

	stream_ >> data;

	return *this;
}

//////////////////////////////////////////////////////////////////////////
//

template<typename data_type>
data_type&& recv_packet_t::parse()
{
	data_type data;
	(*this) >> (data);
	return std::move( data );
}

//////////////////////////////////////////////////////////////////////////